रिएक्ट use हुक संसाधन प्रबंधन: शीर्ष प्रदर्शन के लिए संसाधन जीवनचक्र का अनुकूलन | MLOG | MLOG
हिन्दी
कुशल संसाधन प्रबंधन के लिए रिएक्ट के 'use' हुक में महारत हासिल करें। संसाधन जीवनचक्र को सुव्यवस्थित करना, प्रदर्शन में सुधार करना और सामान्य गलतियों से बचना सीखें।
रिएक्ट use हुक संसाधन प्रबंधन: शीर्ष प्रदर्शन के लिए संसाधन जीवनचक्र का अनुकूलन
रिएक्ट "use" हुक, जिसे रिएक्ट सर्वर कंपोनेंट्स (RSCs) के साथ पेश किया गया था, हमारे रिएक्ट एप्लिकेशन के भीतर संसाधनों के प्रबंधन के तरीके में एक आदर्श बदलाव का प्रतिनिधित्व करता है। हालांकि इसे शुरू में RSCs के लिए बनाया गया था, इसके सिद्धांत क्लाइंट-साइड कंपोनेंट्स पर भी लागू होते हैं, जो संसाधन जीवनचक्र प्रबंधन, प्रदर्शन अनुकूलन और समग्र कोड रखरखाव में महत्वपूर्ण लाभ प्रदान करते हैं। यह व्यापक गाइड "use" हुक का विस्तार से पता लगाता है, जो आपको इसकी शक्ति का लाभ उठाने में मदद करने के लिए व्यावहारिक उदाहरण और कार्रवाई योग्य अंतर्दृष्टि प्रदान करता है।
"use" हुक को समझना: संसाधन प्रबंधन की नींव
परंपरागत रूप से, रिएक्ट कंपोनेंट्स संसाधनों (डेटा, कनेक्शन, आदि) को जीवनचक्र विधियों (componentDidMount, componentWillUnmount क्लास कंपोनेंट्स में) या useEffect हुक के माध्यम से प्रबंधित करते हैं। ये दृष्टिकोण, हालांकि कार्यात्मक हैं, जटिल कोड का कारण बन सकते हैं, खासकर जब एसिंक्रोनस संचालन, डेटा निर्भरता और त्रुटि प्रबंधन से निपटते हैं। "use" हुक एक अधिक घोषणात्मक और सुव्यवस्थित दृष्टिकोण प्रदान करता है।
"use" हुक क्या है?
"use" हुक रिएक्ट में एक विशेष हुक है जो आपको किसी प्रॉमिस या कॉन्टेक्स्ट के परिणाम को "उपयोग" करने की अनुमति देता है। इसे रिएक्ट सस्पेंस के साथ सहजता से एकीकृत करने के लिए डिज़ाइन किया गया है, जो आपको एसिंक्रोनस डेटा फ़ेचिंग और रेंडरिंग को अधिक सुरुचिपूर्ण ढंग से संभालने में सक्षम बनाता है। महत्वपूर्ण रूप से, यह रिएक्ट के संसाधन प्रबंधन से भी जुड़ता है, सफ़ाई का काम संभालता है और यह सुनिश्चित करता है कि जब संसाधनों की आवश्यकता नहीं रह जाती है तो उन्हें ठीक से जारी किया जाता है।
संसाधन प्रबंधन के लिए "use" हुक का उपयोग करने के प्रमुख लाभ:
सरलीकृत एसिंक्रोनस डेटा हैंडलिंग: डेटा फ़ेच करने, लोडिंग स्टेट्स को प्रबंधित करने और त्रुटियों को संभालने से जुड़े बॉयलरप्लेट कोड को कम करता है।
स्वचालित संसाधन सफ़ाई: यह सुनिश्चित करता है कि जब कंपोनेंट अनमाउंट हो जाता है या डेटा की आवश्यकता नहीं रह जाती है तो संसाधनों को जारी कर दिया जाता है, जिससे मेमोरी लीक को रोका जा सकता है और प्रदर्शन में सुधार होता है।
बेहतर कोड पठनीयता और रखरखाव: घोषणात्मक सिंटैक्स कोड को समझना और बनाए रखना आसान बनाता है।
सस्पेंस के साथ सहज एकीकरण: डेटा लोडिंग के दौरान एक सहज उपयोगकर्ता अनुभव के लिए रिएक्ट सस्पेंस का लाभ उठाता है।
उन्नत प्रदर्शन: संसाधन जीवनचक्र को अनुकूलित करके, "use" हुक एक अधिक प्रतिक्रियाशील और कुशल एप्लिकेशन में योगदान देता है।
मुख्य अवधारणाएँ: सस्पेंस, प्रॉमिस और रिसोर्स रैपर्स
"use" हुक का प्रभावी ढंग से उपयोग करने के लिए, सस्पेंस, प्रॉमिस और रिसोर्स रैपर्स के बीच के तालमेल को समझना आवश्यक है।
सस्पेंस: लोडिंग स्टेट्स को शालीनता से संभालना
सस्पेंस एक रिएक्ट कंपोनेंट है जो आपको घोषणात्मक रूप से एक फॉलबैक यूआई निर्दिष्ट करने की अनुमति देता है जिसे तब प्रदर्शित किया जाता है जब कोई कंपोनेंट डेटा लोड होने की प्रतीक्षा कर रहा हो। यह मैन्युअल लोडिंग स्टेट प्रबंधन की आवश्यकता को समाप्त करता है और एक सहज उपयोगकर्ता अनुभव प्रदान करता है।
उदाहरण:
import React, { Suspense } from 'react';
function MyComponent() {
return (
Loading...
}>
);
}
इस उदाहरण में, DataComponent डेटा फ़ेच करने के लिए "use" हुक का उपयोग कर सकता है। जब तक डेटा लोड हो रहा है, "Loading..." फॉलबैक प्रदर्शित होगा।
प्रॉमिस: एसिंक्रोनस संचालन का प्रतिनिधित्व करना
प्रॉमिस एसिंक्रोनस जावास्क्रिप्ट का एक मूलभूत हिस्सा हैं। वे एक एसिंक्रोनस ऑपरेशन के अंतिम समापन (या विफलता) का प्रतिनिधित्व करते हैं और आपको संचालन को एक साथ श्रृंखलाबद्ध करने की अनुमति देते हैं। "use" हुक सीधे प्रॉमिस के साथ काम करता है।
उदाहरण:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({ data: 'Data from the server!' });
}, 2000);
});
}
यह फ़ंक्शन एक प्रॉमिस लौटाता है जो 2-सेकंड की देरी के बाद कुछ डेटा के साथ हल हो जाता है।
रिसोर्स रैपर्स: संसाधन तर्क को समाहित करना
जबकि "use" हुक सीधे प्रॉमिस का उपभोग कर सकता है, संसाधन तर्क को एक समर्पित रिसोर्स रैपर के भीतर समाहित करना अक्सर फायदेमंद होता है। यह कोड संगठन में सुधार करता है, पुन: प्रयोज्यता को बढ़ावा देता है, और परीक्षण को सरल बनाता है।
उदाहरण:
const createResource = (promise) => {
let status = 'pending';
let result;
let suspender = promise().then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
}
);
return {
read() {
if (status === 'pending') {
throw suspender;
} else if (status === 'error') {
throw result;
} else if (status === 'success') {
return result;
}
},
};
};
const myResource = createResource(fetchData);
function DataComponent() {
const data = use(myResource.read());
return
{data.data}
;
}
इस उदाहरण में, createResource एक प्रॉमिस-रिटर्निंग फ़ंक्शन लेता है और एक read विधि के साथ एक रिसोर्स ऑब्जेक्ट बनाता है। read विधि प्रॉमिस को फेंक देती है यदि डेटा अभी भी लंबित है, कंपोनेंट को निलंबित करती है, और यदि प्रॉमिस अस्वीकार हो जाता है तो त्रुटि को फेंक देती है। यह उपलब्ध होने पर डेटा लौटाता है। यह पैटर्न आमतौर पर रिएक्ट सर्वर कंपोनेंट्स के साथ प्रयोग किया जाता है।
व्यावहारिक उदाहरण: "use" के साथ संसाधन प्रबंधन लागू करना
आइए विभिन्न परिदृश्यों में संसाधन प्रबंधन के लिए "use" हुक का उपयोग करने के कुछ व्यावहारिक उदाहरण देखें।
उदाहरण 1: एपीआई से डेटा फ़ेच करना
यह उदाहरण दिखाता है कि "use" हुक और सस्पेंस का उपयोग करके एपीआई से डेटा कैसे फ़ेच किया जाए।
import React, { Suspense, use } from 'react';
async function fetchData() {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Failed to fetch data');
}
return response.json();
}
const DataResource = () => {
const promise = fetchData();
return {
read() {
const result = use(promise);
return result;
}
}
}
function DataComponent() {
const resource = DataResource();
const data = resource.read();
return (
Data: {data.message}
);
}
function App() {
return (
Loading data...
}>
);
}
export default App;
स्पष्टीकरण:
fetchData: यह एसिंक्रोनस फ़ंक्शन एक एपीआई एंडपॉइंट से डेटा फ़ेच करता है। इसमें त्रुटि प्रबंधन शामिल है ताकि फ़ेच विफल होने पर एक त्रुटि फेंकी जा सके।
DataResource: यह रिसोर्स रैपिंग फ़ंक्शन है, जिसमें प्रॉमिस और "read" कार्यान्वयन शामिल है जो "use" हुक को कॉल करता है।
DataComponent: DataResource की रीड मेथड का उपयोग करता है, जो आंतरिक रूप से डेटा प्राप्त करने के लिए "use" हुक का उपयोग करता है। यदि डेटा अभी तक उपलब्ध नहीं है, तो कंपोनेंट निलंबित हो जाता है।
App: DataComponent को सस्पेंस के साथ लपेटता है, डेटा लोड होने के दौरान एक फॉलबैक यूआई प्रदान करता है।
उदाहरण 2: वेबसॉकेट कनेक्शन का प्रबंधन
यह उदाहरण दिखाता है कि "use" हुक और एक कस्टम रिसोर्स रैपर का उपयोग करके वेबसॉकेट कनेक्शन का प्रबंधन कैसे करें।
);
}
function App() {
return (
Connecting to WebSocket...
}>
);
}
export default App;
स्पष्टीकरण:
createWebSocketResource: एक वेबसॉकेट कनेक्शन बनाता है और उसके जीवनचक्र का प्रबंधन करता है। यह कनेक्शन स्थापना, संदेश भेजने और कनेक्शन बंद करने का काम संभालता है।
WebSocketComponent: वेबसॉकेट सर्वर से कनेक्ट करने के लिए createWebSocketResource का उपयोग करता है। यह socketResource.read() का उपयोग करता है जो कनेक्शन स्थापित होने तक रेंडरिंग को निलंबित करने के लिए "use" हुक का उपयोग करता है। यह संदेश भेजने और प्राप्त करने का भी प्रबंधन करता है। useEffect हुक यह सुनिश्चित करने के लिए महत्वपूर्ण है कि कंपोनेंट के अनमाउंट होने पर सॉकेट कनेक्शन बंद हो जाए, जिससे मेमोरी लीक को रोका जा सके और उचित संसाधन प्रबंधन सुनिश्चित हो सके।
App: WebSocketComponent को सस्पेंस के साथ लपेटता है, कनेक्शन स्थापित होने के दौरान एक फॉलबैक यूआई प्रदान करता है।
उदाहरण 3: फ़ाइल हैंडल्स का प्रबंधन
यह उदाहरण NodeJS फ़ाइल हैंडल्स का उपयोग करके "use" हुक के साथ संसाधन प्रबंधन को दिखाता है (यह केवल NodeJS वातावरण में कार्य करेगा और इसका उद्देश्य संसाधन जीवनचक्र अवधारणाओं को प्रदर्शित करना है)।
// This example is designed for a NodeJS environment
const fs = require('node:fs/promises');
import React, { use } from 'react';
const createFileHandleResource = async (filePath) => {
let fileHandle;
const openFile = async () => {
fileHandle = await fs.open(filePath, 'r');
return fileHandle;
};
const promise = openFile();
return {
read() {
return use(promise);
},
async close() {
if (fileHandle) {
await fileHandle.close();
fileHandle = null;
}
},
async readContents() {
const handle = use(promise);
const buffer = await handle.readFile();
return buffer.toString();
}
};
};
function FileViewer({ filePath }) {
const fileHandleResource = createFileHandleResource(filePath);
const contents = fileHandleResource.readContents();
React.useEffect(() => {
return () => {
// Cleanup when the component unmounts
fileHandleResource.close();
};
}, [fileHandleResource]);
return (
File Contents:
{contents}
);
}
// Example Usage
async function App() {
const filePath = 'example.txt';
await fs.writeFile(filePath, 'Hello, world!\nThis is a test file.');
return (
);
}
export default App;
स्पष्टीकरण:
createFileHandleResource: एक फ़ाइल खोलता है और एक संसाधन लौटाता है जो फ़ाइल हैंडल को समाहित करता है। यह फ़ाइल खुलने तक निलंबित करने के लिए "use" हुक का उपयोग करता है। यह फ़ाइल हैंडल को जारी करने के लिए एक close विधि भी प्रदान करता है जब इसकी आवश्यकता नहीं रह जाती है। यूज़ हुक वास्तविक प्रॉमिस और निलंबन का प्रबंधन करता है, जबकि क्लोज फ़ंक्शन सफ़ाई का काम संभालता है।
FileViewer: एक फ़ाइल की सामग्री प्रदर्शित करने के लिए createFileHandleResource का उपयोग करता है। useEffect हुक अनमाउंट पर संसाधन के क्लोज फ़ंक्शन को निष्पादित करता है, यह सुनिश्चित करता है कि उपयोग के बाद फ़ाइल संसाधन मुक्त हो जाए।
App: एक उदाहरण टेक्स्ट फ़ाइल बनाता है, फिर FileViewer कंपोनेंट प्रदर्शित करता है।
उन्नत तकनीकें: एरर बाउंड्रीज, रिसोर्स पूलिंग, और सर्वर कंपोनेंट्स
बुनियादी उदाहरणों से परे, "use" हुक को अधिक परिष्कृत संसाधन प्रबंधन रणनीतियों को लागू करने के लिए अन्य रिएक्ट सुविधाओं के साथ जोड़ा जा सकता है।
एरर बाउंड्रीज: त्रुटियों को शालीनता से संभालना
एरर बाउंड्रीज रिएक्ट कंपोनेंट्स हैं जो अपने चाइल्ड कंपोनेंट ट्री में कहीं भी जावास्क्रिप्ट त्रुटियों को पकड़ते हैं, उन त्रुटियों को लॉग करते हैं, और पूरे कंपोनेंट ट्री को क्रैश करने के बजाय एक फॉलबैक यूआई प्रदर्शित करते हैं। "use" हुक का उपयोग करते समय, डेटा फ़ेचिंग या संसाधन आरंभीकरण के दौरान संभावित त्रुटियों को संभालने के लिए अपने कंपोनेंट्स को एरर बाउंड्रीज के साथ लपेटना महत्वपूर्ण है।
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return
कुछ परिदृश्यों में, बार-बार संसाधन बनाना और नष्ट करना महंगा हो सकता है। रिसोर्स पूलिंग में संसाधन निर्माण और विनाश के ओवरहेड को कम करने के लिए पुन: प्रयोज्य संसाधनों का एक पूल बनाए रखना शामिल है। जबकि "use" हुक स्वाभाविक रूप से रिसोर्स पूलिंग को लागू नहीं करता है, इसे एक अलग रिसोर्स पूल कार्यान्वयन के साथ संयोजन में उपयोग किया जा सकता है।
एक डेटाबेस कनेक्शन पूल पर विचार करें। प्रत्येक अनुरोध के लिए एक नया कनेक्शन बनाने के बजाय, आप पूर्व-स्थापित कनेक्शनों का एक पूल बनाए रख सकते हैं और उनका पुन: उपयोग कर सकते हैं। "use" हुक का उपयोग पूल से कनेक्शन के अधिग्रहण और रिलीज का प्रबंधन करने के लिए किया जा सकता है।
(अवधारणात्मक उदाहरण - कार्यान्वयन विशिष्ट संसाधन और पूलिंग लाइब्रेरी के आधार पर भिन्न होता है):
// Conceptual Example (not a complete, runnable implementation)
import React, { use } from 'react';
// Assume a database connection pool library exists
import { getConnectionFromPool, releaseConnectionToPool } from './dbPool';
const createDbConnectionResource = () => {
let connection;
const acquireConnection = async () => {
connection = await getConnectionFromPool();
return connection;
};
const promise = acquireConnection();
return {
read() {
return use(promise);
},
release() {
if (connection) {
releaseConnectionToPool(connection);
connection = null;
}
},
query(sql) {
const conn = use(promise);
return conn.query(sql);
}
};
};
function MyDataComponent() {
const dbResource = createDbConnectionResource();
React.useEffect(() => {
return () => {
dbResource.release();
};
}, [dbResource]);
const data = dbResource.query('SELECT * FROM my_table');
return
{data}
;
}
रिएक्ट सर्वर कंपोनेंट्स (RSCs): "use" हुक का प्राकृतिक घर
"use" हुक को शुरू में रिएक्ट सर्वर कंपोनेंट्स के लिए डिज़ाइन किया गया था। RSCs सर्वर पर निष्पादित होते हैं, जिससे आप क्लाइंट को कोड भेजे बिना डेटा फ़ेच कर सकते हैं और अन्य सर्वर-साइड संचालन कर सकते हैं। यह प्रदर्शन में काफी सुधार करता है और क्लाइंट-साइड जावास्क्रिप्ट बंडल आकार को कम करता है।
RSCs में, "use" हुक का उपयोग सीधे डेटाबेस या एपीआई से डेटा फ़ेच करने के लिए किया जा सकता है, बिना क्लाइंट-साइड फ़ेचिंग लाइब्रेरी की आवश्यकता के। डेटा सर्वर पर फ़ेच किया जाता है, और परिणामी एचटीएमएल क्लाइंट को भेजा जाता है, जहाँ इसे रिएक्ट द्वारा हाइड्रेट किया जाता है।
RSCs में "use" हुक का उपयोग करते समय, RSCs की सीमाओं से अवगत होना महत्वपूर्ण है, जैसे कि क्लाइंट-साइड स्टेट और इवेंट हैंडलर की कमी। हालांकि, RSCs को शक्तिशाली और कुशल एप्लिकेशन बनाने के लिए क्लाइंट-साइड कंपोनेंट्स के साथ जोड़ा जा सकता है।
"use" के साथ प्रभावी संसाधन प्रबंधन के लिए सर्वोत्तम अभ्यास
संसाधन प्रबंधन के लिए "use" हुक के लाभों को अधिकतम करने के लिए, इन सर्वोत्तम प्रथाओं का पालन करें:
संसाधन तर्क को समाहित करें: संसाधन निर्माण, उपयोग और सफ़ाई तर्क को समाहित करने के लिए समर्पित रिसोर्स रैपर्स बनाएं।
एरर बाउंड्रीज का उपयोग करें: संसाधन आरंभीकरण और डेटा फ़ेचिंग के दौरान संभावित त्रुटियों को संभालने के लिए अपने कंपोनेंट्स को एरर बाउंड्रीज के साथ लपेटें।
संसाधन सफ़ाई लागू करें: सुनिश्चित करें कि जब संसाधनों की आवश्यकता नहीं रह जाती है तो उन्हें जारी कर दिया जाता है, या तो useEffect हुक या कस्टम सफ़ाई कार्यों के माध्यम से।
रिसोर्स पूलिंग पर विचार करें: यदि आप बार-बार संसाधन बना और नष्ट कर रहे हैं, तो प्रदर्शन को अनुकूलित करने के लिए रिसोर्स पूलिंग का उपयोग करने पर विचार करें।
रिएक्ट सर्वर कंपोनेंट्स का लाभ उठाएं: सर्वर-साइड डेटा फ़ेचिंग और रेंडरिंग के लिए रिएक्ट सर्वर कंपोनेंट्स के लाभों का पता लगाएं।
"use" हुक की सीमाओं को समझें: याद रखें कि "use" हुक को केवल रिएक्ट कंपोनेंट्स और कस्टम हुक के अंदर ही कॉल किया जा सकता है।
पूरी तरह से परीक्षण करें: यह सुनिश्चित करने के लिए यूनिट और इंटीग्रेशन परीक्षण लिखें कि आपका संसाधन प्रबंधन तर्क सही ढंग से काम कर रहा है।
अपने एप्लिकेशन को प्रोफ़ाइल करें: प्रदर्शन की बाधाओं की पहचान करने और अपने संसाधन उपयोग को अनुकूलित करने के लिए रिएक्ट के प्रोफ़ाइलिंग टूल का उपयोग करें।
सामान्य गलतियाँ और उनसे कैसे बचें
हालांकि "use" हुक कई लाभ प्रदान करता है, संभावित नुकसानों और उनसे बचने के तरीकों से अवगत होना महत्वपूर्ण है।
मेमोरी लीक: जब संसाधनों की आवश्यकता नहीं रह जाती है तो उन्हें जारी करने में विफल रहने से मेमोरी लीक हो सकती है। हमेशा सुनिश्चित करें कि आपके पास संसाधनों की सफ़ाई के लिए एक तंत्र है, जैसे कि useEffect हुक या कस्टम सफ़ाई कार्य।
अनावश्यक री-रेंडर: अनावश्यक रूप से री-रेंडर को ट्रिगर करना प्रदर्शन को प्रभावित कर सकता है। हर रेंडर पर नए संसाधन इंस्टेंस बनाने से बचें। संसाधन इंस्टेंस को मेमोइज़ करने के लिए useMemo या इसी तरह की तकनीकों का उपयोग करें।
अनंत लूप: "use" हुक का गलत तरीके से उपयोग करना या चक्रीय निर्भरता बनाना अनंत लूप का कारण बन सकता है। यह सुनिश्चित करने के लिए अपने कोड की सावधानीपूर्वक समीक्षा करें कि आप अनंत री-रेंडर का कारण नहीं बन रहे हैं।
अनहैंडल्ड त्रुटियां: संसाधन आरंभीकरण या डेटा फ़ेचिंग के दौरान त्रुटियों को संभालने में विफल रहने से अप्रत्याशित व्यवहार हो सकता है। त्रुटियों को शालीनता से संभालने के लिए एरर बाउंड्रीज और ट्राई-कैच ब्लॉक का उपयोग करें।
क्लाइंट कंपोनेंट्स में "use" पर अत्यधिक निर्भरता: जबकि "use" हुक का उपयोग क्लाइंट कंपोनेंट्स में पारंपरिक डेटा फ़ेचिंग विधियों के साथ किया जा सकता है, विचार करें कि क्या सर्वर कंपोनेंट आर्किटेक्चर आपकी डेटा फ़ेचिंग आवश्यकताओं के लिए बेहतर फिट हो सकता है।
निष्कर्ष: अनुकूलित रिएक्ट एप्लिकेशन के लिए "use" हुक को अपनाना
रिएक्ट "use" हुक रिएक्ट एप्लिकेशन के भीतर संसाधन प्रबंधन में एक महत्वपूर्ण प्रगति का प्रतिनिधित्व करता है। एसिंक्रोनस डेटा हैंडलिंग को सरल बनाकर, संसाधन सफ़ाई को स्वचालित करके, और सस्पेंस के साथ सहजता से एकीकृत करके, यह डेवलपर्स को अधिक प्रदर्शनकारी, रखरखाव योग्य और उपयोगकर्ता-अनुकूल एप्लिकेशन बनाने के लिए सशक्त बनाता है।
मुख्य अवधारणाओं को समझकर, व्यावहारिक उदाहरणों की खोज करके, और सर्वोत्तम प्रथाओं का पालन करके, आप संसाधन जीवनचक्र को अनुकूलित करने और अपने रिएक्ट एप्लिकेशन की पूरी क्षमता को अनलॉक करने के लिए "use" हुक का प्रभावी ढंग से लाभ उठा सकते हैं। जैसे-जैसे रिएक्ट का विकास जारी है, "use" हुक निस्संदेह रिएक्ट इकोसिस्टम में संसाधन प्रबंधन के भविष्य को आकार देने में एक महत्वपूर्ण भूमिका निभाएगा।